/**
 * \file   opciones.cpp
 * \author Fabian Jesus Machado
 * \date   Septiembre de 2011
 * 
 *  Este archivo es parte del proyecto NPASM, un ensamblador para
 * microcontroladores PIC con sintaxis Intel, desarrollado inicialmente
 * por Fabian Machado (fabianjsm@gmail.com, twitter@fabianjsm).
 *  El codigo fuente esta diponible en el repositorio SVN de Google:
 *      http://npasm.googlecode.com/svn/trunk.
 * 
 *  Este archivo posee funciones encargadas de analizar las opciones
 * pasadas en la linea de comandos.
 * 
 *  Tenga en cuenta que los argumentos de la linea de comandos son
 * evaluados con getopt de la libreria GNU C, de modo que segun como
 * este compilada LIBC, los mensajes de error emitidos por esta seran en
 * ingles, del tipo “option requires an argument”.
 * 
 */
#include <iostream>
#include <getopt.h>
#include "entorno.h"
#include "npasm.h"
#include "opciones.h"

using namespace std;

/** Lista de opciones cortas */
const char *const op_a = "D:hI:vo:";

/** Lista de opciones largas */
const struct option op_aa[] = {
	{"define",  1, NULL, 'D'},
	{"help",    0, NULL, 'h'},
	{"incdir",  1, NULL, 'I'},
	{"version", 0, NULL, 'v'},
	{"output",  1, NULL, 'o'},
	{NULL,      0, NULL, 0}
};

void opciones(int argc, char *const *argv)
{
	int i, c;
	try {
		while((c = getopt_long(argc, argv, op_a, op_aa, &i)) != -1) {
			switch(c) {
			case 'h':
			case 'v':
				Ayuda(c);
				break;
			case 'o':
				Entorno->SetSalida(optarg);
				break;
			case 'I':
				Entorno->SetIncDir(optarg);
				break;
			case 'D':
				Entorno->SetDefine(optarg);
				break;
			default:
				throw(string("formato incorrecto"));
			}
			
		}
		
		if(optind == argc)
			throw(string("ningun archivo"));
			
		for(; optind < argc; optind++)
			Entorno->SetEntrada(argv[optind]);
	}
	catch(string e) {
		e += " en linea de comandos";
		throw(e);
	}
}
